home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2002 #11 / Amiga Plus CD - 2002 - No. 11.iso / Tools / ShareMailGiftware / Frogger / plugins_src / p_ac3 / ac3.c < prev    next >
C/C++ Source or Header  |  2002-10-28  |  2KB  |  122 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #include "inttypes.h"
  6. #include "a52.h"
  7. #include "ac3.h"
  8. #include "mm_accel.h"
  9.  
  10. static __inline int16_t convert (int32_t i)
  11. {
  12.     if (i > 0x43c07fff)
  13.     return 32767;
  14.     else if (i < 0x43bf8000)
  15.     return -32768;
  16.     else
  17.     return i - 0x43c00000;
  18. }
  19.  
  20. static __inline void float_to_int (float * _f, int16_t * s16)
  21. {
  22.     int i;
  23.     int32_t * f = (int32_t *) _f;
  24.  
  25.     s16 -= 1;
  26.  
  27.     for (i = 0; i < 256; i++)
  28.     {
  29.         *(++s16) = convert (f[i]);
  30.         *(++s16) = convert (f[i+256]);
  31.     }
  32. }
  33.  
  34. void decodeAC3(void *handle, unsigned char *start, unsigned char *end,unsigned char *out, int *outsize,int *freq)
  35. {
  36.     a52_state_t * state = handle;
  37.     static uint8_t buf[3840];
  38.     static uint8_t * bufptr = buf;
  39.     static uint8_t * bufpos = buf + 7;
  40.     static int sample_rate;
  41.     static int flags;
  42.     int bit_rate;
  43.     int len;
  44.  
  45.     *outsize = 0;
  46.  
  47.     while (1)
  48.     {
  49.         len = end - start;
  50.         if (!len)
  51.             break;
  52.  
  53.         if (len > bufpos - bufptr)
  54.             len = bufpos - bufptr;
  55.  
  56.         memcpy (bufptr, start, len);
  57.         bufptr += len;
  58.         start += len;
  59.  
  60.         if (bufptr == bufpos)
  61.         {
  62.             if (bufpos == buf + 7)
  63.             {
  64.                 int length;
  65.  
  66.                 length = a52_syncinfo (buf, &flags, &sample_rate, &bit_rate);
  67.                 if (!length)
  68.                 {
  69.                     for (bufptr = buf; bufptr < buf + 6; bufptr++)
  70.                         bufptr[0] = bufptr[1];
  71.                     continue;
  72.                 }
  73.                 bufpos = buf + length;
  74.             }
  75.             else
  76.             {
  77.                 sample_t level, bias;
  78.                 int i;
  79.  
  80.                 flags = A52_STEREO | A52_ADJUST_LEVEL;
  81.                 level = 4;
  82.                 bias = 384;
  83.  
  84.                 if (a52_frame (state, buf, &flags, &level, bias))
  85.                     goto error;
  86.  
  87.                 a52_dynrng (state, NULL, NULL);
  88.  
  89.                 for (i = 0; i < 6; i++)
  90.                 {
  91.                     if (a52_block (state))
  92.                         goto error;
  93.  
  94.                     float_to_int (a52_samples (state), (int16_t *)out);
  95.                     out += (256*2*2);        //256 samples, two channels, two bytes per sample
  96.                     *outsize += (256*2*2);
  97.  
  98.                 }
  99.                 bufptr = buf;
  100.                 bufpos = buf + 7;
  101.                 continue;
  102.             error:
  103.                 bufptr = buf;
  104.                 bufpos = buf + 7;
  105.             }
  106.         }
  107.     }
  108.     if(freq)
  109.         *freq = sample_rate;
  110. }
  111.  
  112. void *initAC3(void)
  113. {
  114.     return a52_init (MM_ACCEL_DJBFFT);
  115. }
  116.  
  117. void closeAC3(void *handle)
  118. {
  119.     if(handle)
  120.         a52_free (handle);
  121. }
  122.